package Array;

import java.util.ArrayList;
import java.util.List;

/**
 * 54. 螺旋矩阵
 * 给你一个 m 行 n 列的矩阵 matrix ，请按照 顺时针螺旋顺序 ，返回矩阵中的所有元素。
 *
 * 思路：因为是顺时针，所以方向是 右--》下---》左--》上
 *     对于这道题，顺时针走一圈相当于一个环，然后这个环再缩小一圈，走下一个环，
 *     如何定义这个环， 我们可以使用四个边界值定义这个环， 采用 上，下，左，右这四个边界值，只要满足 上《=下， 左 <= 右， 就能遍历这个环
 *  代码如下：
 */
public class L_54 {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> result = new ArrayList<>();
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return result;
        }
        int top = 0,left =0;
        int bottom = matrix.length-1,right = matrix[0].length-1;

        // 满足条件
        while (top <= bottom && left <= right){
            // 从左到右遍历， 上边界
            for (int i = left; i <= right ; i++) {
                result.add(matrix[top][i]);
            }
            //上边界向下+1
            top++;
            // 从上到下遍历，右边界
            for (int i = top; i <= bottom ; i++) {
                result.add(matrix[i][right]);
            }
            // 有边界向左-1
            right--;
            // 从右到左遍历, 如果还有行，判断行的条件是上下边界存在
            if(top<= bottom){
                for (int i = right; i >=left ; i--) {
                    result.add(matrix[bottom][i]);
                }
            }
            bottom--;
            // 从下到上遍历，如果还有列，判断列的条件是左右边界存在
            if(left <= right){
                for (int i = bottom; i >= top ; i--) {
                    result.add(matrix[i][left]);
                }
            }
            left++;
        }
        return result;
    }
}
